package com.longjianghuasheng.logistics.base

import android.os.Bundle
import androidx.databinding.ViewDataBinding
import androidx.navigation.NavOptions
import androidx.navigation.findNavController
import com.longjianghuasheng.logistics.ext.dismissLoadingExt
import com.longjianghuasheng.logistics.ext.hideSoftKeyboard
import com.longjianghuasheng.logistics.ext.navOptions
import com.longjianghuasheng.logistics.ext.showLoadingExt
import com.longjianghuasheng.logistics.util.StatusBarUtil
import com.longjianghuasheng.logistics.R

import me.hgj.jetpackmvvm.base.fragment.BaseVmDbFragment
import me.hgj.jetpackmvvm.base.viewmodel.BaseViewModel
import me.hgj.jetpackmvvm.ext.nav
import me.hgj.jetpackmvvm.ext.navigateAction


/**
 * 作者　: hegaojian
 * 时间　: 2019/12/21
 * 描述　: 你项目中的Fragment基类，在这里实现显示弹窗，吐司，还有自己的需求操作 ，如果不想用Databind，请继承
 * BaseVmFragment例如
 * abstract class BaseFragment<VM : BaseViewModel> : BaseVmFragment<VM>() {
 */
abstract class BaseFragment<VM : BaseViewModel, DB : ViewDataBinding> : BaseVmDbFragment<VM, DB>() {

    /**
     * 全局的fragment导航，不是首页三个tab的导航
     */
    private val mainNavController by lazy {
        requireActivity().findNavController(R.id.host_fragment)
    }


    /**
     * 当前Fragment绑定的视图布局
     */
    abstract override fun layoutId(): Int


    abstract override fun initView(savedInstanceState: Bundle?)

    /**
     * 懒加载 只有当前fragment视图显示时才会触发该方法
     */
    override fun lazyLoadData() {}

    /**
     * 创建LiveData观察者 Fragment执行onViewCreated后触发
     */
    override fun createObserver() {}


    override fun onResume() {
        super.onResume()
        StatusBarUtil.setDarkMode(requireActivity())
    }

    /**
     * Fragment执行onViewCreated后触发
     */
    override fun initData() {

    }

    /**
     * 打开等待框
     */
    override fun showLoading(message: String) {
        showLoadingExt(message)
    }

    /**
     * 关闭等待框
     */
    override fun dismissLoading() {
        dismissLoadingExt()
    }

    override fun onPause() {
        super.onPause()
        hideSoftKeyboard(activity)
    }

    /**
     * 延迟加载 防止 切换动画还没执行完毕时数据就已经加载好了，这时页面会有渲染卡顿  bug
     * 这里传入你想要延迟的时间，延迟时间可以设置比转场动画时间长一点 单位： 毫秒
     * 不传默认 300毫秒
     * @return Long
     */
    override fun lazyLoadTime(): Long {
        return 300
    }

    var lastNavTime = 0L


    //跳转
    protected fun navigate(
        resId: Int,
        bundle: Bundle? = null,
        block: NavOptions.Builder.() -> NavOptions.Builder = { this }
    ) {

        nav().navigateAction(
            resId, bundle, navOptions { block() }
        )
    }

    //退出页面
    protected fun navigateUp() {
        nav().navigateUp()
    }
}